from itertools import groupby
import math
from sets import Set

def sqrt(x):
    return x * x

def producto(x,y):
    return x*y

def media_muestral(muestra):
    sumatoriaMuestra = float(sum(muestra))
    tamanMuestra = float(len(muestra))
    resultado = sumatoriaMuestra / tamanMuestra
    return resultado

def desvio_muestral(muestra):
    mm = media_muestral(muestra)
    listaProbabilidad =  [mm for x in range(len(muestra))]
    listaProducto = map(diff_mm_sqrt,muestra,listaProbabilidad)
    result =math.sqrt( sum(listaProducto) / len(listaProducto))
    return result

def varianza_muestral(muestra):
    mm = media_muestral(muestra)
    listaProbabilidad =  [mm for x in range(len(muestra))]
    listaProducto = map(diff_mm_sqrt,muestra,listaProbabilidad)
    result =sum(listaProducto) / len(listaProducto)
    return result


def esperanza_matematica_discreta(sucesos,probabilidad):
    listaProbabilidad =  [probabilidad for x in range(len(sucesos))]
    listaProducto = map(producto,sucesos,listaProbabilidad)
    return sum(listaProducto)

def varianza_discreta(sucesos,probabilidad):
    sumTotal =esperanza_matematica_discreta(map(sqrt,sucesos),probabilidad)
    result = sumTotal - sqrt(esperanza_matematica_discreta(sucesos, probabilidad))
    return result

def desvio_estandar(muestra,probabilidad):
    mm = media_muestral(muestra)
    listaMM =  [mm for x in range(len(muestra))]
    smc = map(diff_mm_sqrt,muestra,listaMM)
    return pow(sum(smc)* probabilidad,0.5)

def media_aritmetica_ponderada(muestra):
    sumTotal =sum(muestra)
    return sumTotal/len(muestra)

def mediana_muestral(muestra):
    muestra_ordenada = sorted(muestra)
    print muestra_ordenada
    return muestra_ordenada[len(muestra)/2]
    
def moda_muestral(muestra):
    muestra_ordenada = sorted(muestra)
    lista_frecuencia=[len(list(group)) for key, group in groupby(muestra_ordenada)]
    print lista_frecuencia
    set_muestra_ordenada=  list(Set(muestra_ordenada))
    index=lista_frecuencia.index(max(lista_frecuencia),0)
    return set_muestra_ordenada[index]

def diff_mm_sqrt(xi,mm):
    return sqrt(xi-mm)

#pp_2 = media_muestral(xj_2)
#print "promedio de los promedios %s " % pp_2 

#xj_3 =[4,4.67,5.33,5.33,6,6.67,6,6.67,7.33,8]
#pp_3 = media_muestral(xj_3)
#print "promedio de los promedios %s " % pp_3
#em=esperanza_matematica_discreta(muestra, mu)
#print "Esperanza matematica %s " % em 
#va=varianza_discreta(muestra,mu)
#print "Varianza %s" % va
#de = desvio_estandar(muestra, mu)
#print "Desvio estandar %s" % de

